home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
CC_C
/
0574.ZIP
/
$MAIN.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-07-25
|
2KB
|
125 lines
include %c86.inc
ttl $MAIN, 1.01, 07-25-86 jwk
; main entry point for all C programs under C86
; similar changes must be made for other compilers
dseg
extv _sysuglo, word
extv _sysvals, word
htop equ _sysvals[2]
extv _args, word
hem db 0dh,0ah,'Not enough RAM to run!$'
dem db 0dh,0ah,'DOS version 2.x or higher required!$'
cseg
extf _main
public $main
$main proc near
mov ah,30h ;check DOS version
int 21h
mov dx,ss ;save SS value
cmp al,2
jnb dok
mov ds,dx ;won't work with 1.x
mov dx,offset dem
mov ah,9
int 21h
int 20h ;so get right out
dok: mov ax,cs:2 ;check RAM usage
sub ax,dx ;result is what's above code
cmp ax,1000h ;if <64K just use it
jna m01 ;else cut back to 64K for DS/SS
; NOTE -- release unused RAM here to permit EXEC function later........
mov ax,1000h
m01: mov cx,4 ;convert to byte count
shl ax,cl
mov si,80h ;look at PSP buffer
mov cl,byte ptr [cs:si] ;get character count
add cl,3
and cl,0feh ;force it to be even
sub ax,cx ;back up to leave space
mov sp,ax ;and set the SP
mov di,ax
mov ss:_args,ax ;save pointer to args
assume cs:code,ds:code,es:data,ss:data
mov es,dx
cld
rep movsb ;move to be above heap
assume cs:code,ds:data,es:data,ss:data
mov ds,dx ;set Data Segment after move
mov bp,cx ;zero BP now
mov di,_sysuglo ;start of heap per loader
mov cx,_sysuglo[2] ;size initialized by loader
add htop,di ;add to reserve
add htop,cx ;and increment by what's in use
cmp htop,sp
jnb herr
xor ax,ax
rep stosb ;clear the free space
call _main
jmp short ex1
;
herr: mov ah,9
mov dx,ss ;be sure of DS
mov ds,dx
mov dx,offset hem
int 21h
mov ax,00ffh ;255=heap error
jmp short ex1
;
public _exit
_exit: push bp
mov bp,sp
mov ax,4[bp]
ex1: mov ah,4ch ; exit, set ret value
int 21h
public $entry0
$entry0:
pop si
xor ax,ax
jmp short entc
;
public $entry1
$entry1:
pop si
cld
db 2eh ;CS: prefix
lodsb
mov ah,0
jmp short entc
;
public $entry2
$entry2:
pop si
cld
db 2eh ;CS: prefix
lodsw
entc: push bp
mov bp,sp
sub sp,ax
cmp sp,htop
jna herr
jmp si
;
pend $main
code ends
end